#! /usr/bin/ruby -Ks
$KCODE = "SJIS"
################################################################################
# 󕶌ɂJIS X0213`̃eLXg JIS X0208`ɐ`XNvg
# 
#
# ̓eLXg̑Ó@ShiftJIS (20002004) sR[hCRLF (CR,LF݂̂łv)
# @@@@@@@@@@@utf-8
#
# Useage
#    43drop.rb ̓eLXgt@C
#    
#		2007/08/30	2004NۏO 10 pairsɑΉ
#					a-zɑΉ
#		2007/09/06	_x0208,_log̉sR[hCR+LFɕύXivbgz[ˑj
#					ہAOAWbNύX
#					_unift@C@\ǉ
#					
#
#
require "rbconfig"
$os = "Mac" if (/darwin/ =~ Config::CONFIG['build_os'])
$os = "Win" if (/mswin32/ =~ Config::CONFIG['build_os'])
require "jcode"
require 'iconv' if ($os == "Mac")
require 'Win32API' if ($os == "Win")
################################################################################
myRequirePath = ""
thisAppPath = ""
ConfigFileName = '43drop.conf'
DicFileName = 'jitai.csv'
if (/\.app/ =~ ARGV[0])
	thisAppPath = ARGV.shift
	thisAppPath += '/'
	$standalone = true
	$config_path = thisAppPath.sub(/\/[^\/]*?\.app/, '') + "#{ConfigFileName}"
	$dictionaly_path = thisAppPath.sub(/\/[^\/]*?\.app/, '') + "#{DicFileName}"
else
	$standalone = false
	if ($Exerb)
		$config_path = ExerbRuntime.filepath.sub(ExerbRuntime.filename, '') + "./#{ConfigFileName}"
		$dictionaly_path = ExerbRuntime.filepath.sub(ExerbRuntime.filename, '') + "./#{DicFileName}"
	else
		$config_path = "./#{ConfigFileName}"
		$dictionaly_path = "./#{DicFileName}"
	end # if exerb
end # if #standalone
myRequirePath = thisAppPath + "Contents/Resources/" if thisAppPath != ""
require "#{myRequirePath}./sconv"
require "#{myRequirePath}./unification.rb"
# 萔`

# O[oϐ`
UniScan=Regexp.new("[" + UniGroupB + "]")

$encoding = "utf"	# or sjis
################################################################################
# Tu[``
def noFileError
  message_box = Win32API.new('user32', 'MessageBoxA', 'LPPI', 'I')
  message_box.call(0, 'ϊt@ChbOhbvĂ', 'ݔN', 0)
end

def endProcess
  message_box = Win32API.new('user32', 'MessageBoxA', 'LPPI', 'I')
  message_box.call(0, 'ϊI܂', 'ݔN', 0)
end
# C[`

if ((ARGV.size == 0) && ($os == "Win"))
	noFileError
	exit
end

begin
	if (File.stat($config_path))
		$encoding = "sjis"
	end # if File.stat
rescue Errno::ENOENT
	$encoding = "utf"
end

	# t@C̓ǂݍ
dict = Hash.new("")
open($dictionaly_path) do |dic|
	while dic.gets
		next if (~/^\s*#/ || ~/^$/)	# #Ŏn܂s̓RgsƂăXLbv
		chop
			# p#ȍ~̓RgAȑO,ŕ
		line, cmt = split(/#/)
		prc, jitai = line.split(/,/)
			# tab ܂̓Xy[Xɑ󔒂폜
		jitai.sub!(/\s+$/, '')
		dict[prc] = jitai
	end # while dic.gets
end # open dictionaly


logfname = ARGV[0].dup
logfname = Iconv.conv("SJIS", "UTF-8-MAC", logfname) if ($os == "Mac")
logfname.sub!(/(\.....?)?$/, "_log\\1")
logfname = Iconv.conv("UTF-8-MAC", "SJIS", logfname) if ($os == "Mac")

open(logfname, "w") do |logfile|
logfile.printf("\xef\xbb\xbf")	# log file is UTF-8 (BOM)
ARGV.each do |inName|
	outName = inName.dup
	outName = Iconv.conv("SJIS", "UTF-8-MAC", outName) if ($os == "Mac")
	outName.sub!(/(\....)?$/, "_x0208\\1")
	outName = Iconv.conv("UTF-8-MAC", "SJIS", outName) if ($os == "Mac")
	unifname = inName.dup
	unifname = Iconv.conv("SJIS", "UTF-8-MAC", unifname) if ($os == "Mac")
	unifname.sub!(/(\.....?)?$/, "_unif\\1")
	unifname = Iconv.conv("UTF-8-MAC", "SJIS", unifname) if ($os == "Mac")

	logfile.printf("%s\x0d\x0a", File.basename(inName).sj2utf8)
	open(unifname, "w") do |unifile|
	open(outName, "w")  do |x0208|
	open(inName) do |infile|
		if ($os == "Mac")
			unifile.printf("\xef\xbb\xbf#%s\x0d\x0a", File.expand_path(inName))	# unif file is UTF-8 (BOM)
		else
			unifile.printf("\xef\xbb\xbf#%s\x0d\x0a", File.expand_path(inName).sj2utf8)	# unif file is UTF-8 (BOM)
		end #if
		lineNo = 0
		chgpt = 0
		while infile.gets
			chop
			lineNo += 1		# sԍ𐔂
			gsub!(/^\xef\xbb\xbf/, '')	if (lineNo == 1) # BOM
			$_ = $_.utf82sj if ($encoding == "utf")	# unicodeȂAsjis2004ɕϊ

			line = ""
			buf = ""
			offset = 0
			$_.each_char do |ch|
					# ۏ
				if (UniScan =~ ch)
					offset += 1
					buf = sprintf("%s,%s,%04d,%04d\x0d\x0a", UniTable[ch], ch, lineNo, offset)
					unifile.printf buf.sj2utf8
					buf = sprintf("@@ : %4dsڂ́n%smn%smɒu܂B\x0d\x0a", lineNo, ch, ch.tr(UniGroupB, UniGroupA))
					logfile.print buf.sj2utf8
					ch.tr!(UniGroupB, UniGroupA)
					chgpt += 1
					line += ch
				else # if ch match UniScan
						# OL
					pg, lo, co, lv = ch.sj2ku
					x0213 = false
					chuki = ""
					buf = ""
					if (lv > 2)		# OEl
						prc = sprintf("%d-%d-%d", pg, lo, co)
						chuki = sprintf("mu%svA%d%d-%d-%dn",dict[prc] , lv, pg, lo, co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((lv < 1) && (dict["#{pg}-#{lo}-#{co}"] != ""))		# LAɓo^
						prc = sprintf("%d-%d-%d", pg, lo, co)
						chuki = sprintf("m%sA%d-%d-%dn",dict[prc] , pg, lo, co)
						offset += chuki.jsize
						if (/\/ =~ dict[prc])
							buf = sprintf("@O : %4dsڂ́n %smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						else
							buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						end #if
						x0213 = true
					elsif ((pg == 1) && (lo == 2) && (co == 19))				# x莚A
						chuki = sprintf("^")
						buf = sprintf("@@ : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg == 1) && (lo == 2) && (co == 20))
						chuki = sprintf("^")
						buf = sprintf("@@ : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg == 1) && (lo == 2) && (co == 21))
						chuki = sprintf("_")
						buf = sprintf("@@ : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 12) && ((20 < co) && (co < 33)))	# LALŐ
						chuki = sprintf("m[}%dA1-12-%dn", (co - 20), co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 12) && ((32 < co) && (co < 59)))
						chuki = sprintf("m%cA1-12-%dn", (co + 64), co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 13) && ((20 < co) && (co < 32)))
						chuki = sprintf("m[}%dA1-13-%dn", (co - 20), co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 13) && (co == 55))
						chuki = sprintf("m[}12A1-13-%dn", co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 12) && ((0 < co) && (co < 21)))
						chuki = sprintf("m%dA1-12-%dn", co, co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 13) && ((0 < co) && (co < 21)))
						chuki = sprintf("m%dA1-13-%dn", co, co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 8) && ((32 < co) && (co < 63)))
						chuki = sprintf("m%dA1-8-%dn", (co - 12), co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif ((pg ==1) && (lo == 6) && ((57 < co) && (co < 68)))
						chuki = sprintf("md%dA1-6-%dn", (co - 57), co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					elsif (lv == -1)
						chuki = sprintf("mLA1-%d-%dn", lo, co)
						buf = sprintf("@O : %4dsڂ́n%smOL@%sɒu܂B\x0d\x0a", lineNo, ch, chuki)
						x0213 = true
					end # E񐅏
						# x208֑镶
					if (x0213)
						line += chuki
						offset += chuki.jsize
						logfile.print buf.sj2utf8
						chgpt += 1
					else
						line += ch
						offset += 1
					end #if OL
				end #if 
			end # each char
			x0208.printf("%s\x0d\x0a", line)
		end # while gets
		buf = sprintf("ȏA%4d ̕ύXs܂̂ŁAmF肢܂\x0d\x0a\x0d\x0a", chgpt)
		logfile.print buf.sj2utf8
	end # open infile
	end # open x0208
	end #open unifile
end # each ARGV
end #open logfile

if ($os == "Win")
	endProcess
end